/**
 * Boolean filters use unique radio group IDs (so you can have more than one!)
 * <p>
 * <b><u>Example Usage:</u></b>
 * </p>
 * 
 * <pre><code>
 * var filters = Ext.create('Ext.ux.grid.GridFilters', {
 *     ...
 *     filters: [{
 *         // required configs
 *         type: 'boolean',
 *         dataIndex: 'visible'
 * 
 *         // optional configs
 *         defaultValue: null, // leave unselected (false selected by default)
 *         yesText: 'Yes',     // default
 *         noText: 'No'        // default
 *     }]
 * });
 * </code></pre>
 */
Ext.define('Ext.ux.grid.filter.BooleanFilter', {
			extend : 'Ext.ux.grid.filter.Filter',
			alias : 'gridfilter.boolean',

			/**
			 * @cfg {Boolean} defaultValue Set this to null if you do not want
			 *      either option to be checked by default. Defaults to false.
			 */
			defaultValue : false,
			/**
			 * @cfg {String} yesText Defaults to 'Yes'.
			 */
			yesText : 'Yes',
			/**
			 * @cfg {String} noText Defaults to 'No'.
			 */
			noText : 'No',

			/**
			 * @private Template method that is to initialize the filter and
			 *          install required menu items.
			 */
			init : function(config) {
				var gId = Ext.id();
				this.options = [Ext.create('Ext.menu.CheckItem', {
									text : this.yesText,
									group : gId,
									checked : this.defaultValue === true
								}), Ext.create('Ext.menu.CheckItem', {
									text : this.noText,
									group : gId,
									checked : this.defaultValue === false
								})];

				this.menu.add(this.options[0], this.options[1]);

				for (var i = 0; i < this.options.length; i++) {
					this.options[i].on('click', this.fireUpdate, this);
					this.options[i].on('checkchange', this.fireUpdate, this);
				}
			},

			/**
			 * @private Template method that is to get and return the value of
			 *          the filter.
			 * @return {String} The value of this filter
			 */
			getValue : function() {
				return this.options[0].checked;
			},

			/**
			 * @private Template method that is to set the value of the filter.
			 * @param {Object}
			 *            value The value to set the filter
			 */
			setValue : function(value) {
				this.options[value ? 0 : 1].setChecked(true);
			},

			/**
			 * @private Template method that is to get and return serialized
			 *          filter data for transmission to the server.
			 * @return {Object/Array} An object or collection of objects
			 *         containing key value pairs representing the current
			 *         configuration of the filter.
			 */
			getSerialArgs : function() {
				var args = {
					type : 'boolean',
					value : this.getValue()
				};
				return args;
			},

			/**
			 * Template method that is to validate the provided Ext.data.Record
			 * against the filters configuration.
			 * 
			 * @param {Ext.data.Record}
			 *            record The record to validate
			 * @return {Boolean} true if the record is valid within the bounds
			 *         of the filter, false otherwise.
			 */
			validateRecord : function(record) {
				return record.get(this.dataIndex) == this.getValue();
			}
		});
